package com.jidolstar.astro.datetimes
{
	import com.jidolstar.astro.utils.AstroConst;
	import com.jidolstar.astro.utils.AstroMath;
	
	/**
	 * TimeConverter
	 * 
	 * Various static methods.
	 * "Astronomical Algorithms"(2nd Edition), by Jean Meeus
	 * 
	 * @author <a href="mailto@jidolstar@gmail.com">Yongho,Ji</a>
	 * @since 2009.04.03
	 */ 
	public class TimeConverter
	{
		/**
		 * Conversion of Julian Date(JD) to Greenwich Mean Sidereal Time(GMST)
		 * @param jd Julian Date
		 * @return GMST in [rad]
		 */ 
		static public function JD2GMST( JD:Number ):Number
		{
			var T:Number = (JD - 2451545.0) / 36525.0;
			var T2:Number = T * T;
			var GMST_degress:Number = 
							280.46061837 + 360.98564736629 * ( JD - 2451545.0 )  
							+ (0.000387933 - T / 38710000) * T2;
			return AstroMath.normalize( GMST_degress * AstroConst.D2R );
		} 

		/**
		 * Conversion of Julian Date(JD) to Local Mean Sidereal Time(GMST)
		 * @param jd Julian Date
		 * @param longitude Longitude in degrees, East is Positive
		 * @return LMST in [rad]
		 */ 
		static public function JD2LMST( JD:Number, longitude:Number ):Number
		{
			var T:Number = (JD - 2451545.0) / 36525.0;
			var T2:Number = T * T;
			var GMST_degress:Number = 
							280.46061837 + 360.98564736629 * ( JD - 2451545.0 )  
							+ (0.000387933 - T / 38710000) * T2;
			var LMST_degrees:Number = GMST_degress + longitude;
			return 	AstroMath.normalize( LMST_degrees * AstroConst.D2R );	
		}		
		
		/**
		 * Conversion of Julian Date(JD) to Greenwich Apparent(real) Sidereal Time(GAST)
		 * <p>
		 * The Greenwich apparent sidereal time is obtained by adding a correction 
		 * to the Greenwich mean sidereal time computed above. 
		 * The correction term is called the nutation in right ascension or the equation of the equinoxes. Thus,
		 * </p>
		 * 
		 * <p>
		 * GAST = GMST + Δψ cos ε 
		 * </p>
		 * <p>
		 * Δψ cos ε is the equation of the equinoxes. 
		 *</p>
		 * 
		 * <p>
		 * A method of calculation
		 * JDE = Julian Ephemeris Date; it differs from the Julian Date(JD) by the small quantity ΔT
		 * Δψ: 황도상에서 장동운동에 의한 황경 변화값(the nutation in longitude)<br>
		 * Δε: 황도상에서 장동운동에 의한 기울기 변화값(the nutation in obliquity)<br>  
		 * ε0: 적도와 황도의 기울기 평균값(the mean obliquity of the ecliptic)<br>
		 * ε : 적도와 황도의 기울기 실제값(the true obliquity of the ecliptic) ε = ε0 + Δε<br>
		 * Ω : 황도상에서 달의 평균 궤도의 승교점의 경도(Logitude of the ascending node of the Moon's mean obit on the ecliptic)<br>
		 * L : 태양의 평균 황경(the mean logitude of the sun) <br>
		 * L': 달의 평균 황경(the mean logitude of the moon)<br>
		 * <br>
		 * T = (JDE - 2451545)/36525
		 * Ω = 125°.04452 - 1934.136261 T + 0.0020708 T<sup>2</sup> + T<sup>3</sup> / 450000<br>
		 * L = 280°.4665 + 36000°.7698 T<br>
		 * L' = 218°.3165 + 481267°.8813 T<br>
		 * Δψ = -17".20 sin Ω - 1".32 sin 2L - 0".23 sin 2L' + 0".21 sin 2Ω<br>
		 * Δε = +9".20 cos Ω + 0".57 cos 2L + 0".10 cos 2L' - 0".09 cos 2Ω<br>
		 * ε0는 아래 두가지 중에 하나를 선택한다.
		 * <ol>
		 * 		<li> IAU(국제천문연맹)에서 제공한 방법<br>
		 * 		이 방법은 매우 긴 기간에는 적합하지 않다. 가령 2000년 주기면 1", 4000년 주기면 10"의 오차가 난다.<br>
		 * 		ε0 = 23°.43929111 - 46".8150 T -0".00059 T<sup>2</sup> + 0".001813 T<sup>3</sup><br>
		 * 
		 * 		<li> Laskar의 방법<br>
		 * 		이 방법은 1000년 후에 0".01(A.D 1000~ 3000 사이 까지 유효). 10000년이면 수십 arcsecond 차이를 낸다.<br> 
		 * 		단 사용시 주의 사항은 J2000.0을 기준으로 앞뒤로 10000을 넘으면 안된다.<br>
		 * 		
		 * 	    <pre>
		 * 		U = T / 100
		 * 		ε0 =  23°.43929111 - 4580".92 U 
		 * 						   - 1.55 U <sup>2</sup>
		 * 						   + 1999.25 U <sup>3</sup>
		 * 						   - 51.38 U <sup>4</sup>
		 * 						   - 249.67 U <sup>5</sup>
		 * 						   - 39.05 U <sup>6</sup>
		 * 						   + 7.12 U <sup>7</sup>
		 * 						   + 27.87 U <sup>8</sup>
		 * 						   + 5.79 U <sup>9</sup>
		 * 						   + 2.45 U <sup>10</sup>
		 *		</pre> 
		 * 		이 식에 따르면 -7530년에 지구의 자전축의 최대 기울기는 24°14'07". 최대 기울기는 +12030년에 22°36'41"이 된다. 
		 * 		이 식의 그래프의 커브는 거의 선형이다. 그러므로 U<sup>2</sup> 항 이하의 계수값들은 매우 작은 값이라는 것을 알 수 있다.
		 * </ol>
		 * ε = ε0 + Δε
		 * GAST = GMST + Δψ cos ε
		 * </ol>
		 * </p>
		 *
		 */ 
		static public function JD2GAST( jd:Number ):Number
		{
			return 0;
		}
		
		
		static public function JD2LAST( jd:Number ):Number
		{
			return 0;
		}
		
		

	}
}